package com.xuzimian.globaldemo.jmx.mxbean;


import com.xuzimian.globaldemo.jmx.QueueInfo;

import javax.management.AttributeChangeNotification;
import javax.management.MBeanNotificationInfo;
import javax.management.Notification;
import javax.management.NotificationBroadcasterSupport;
import java.util.Date;
import java.util.Queue;

/**
 * MXBean 的实现类，类名称可以是随意
 *
 * @Author xzm
 * @Date 2018/3/13 18:17
 * @Description :
 * 1、Notification这个相当于一个信息包，封装了需要传递的信息
 * 2、Notification broadcaster这个相当于一个广播器，把消息广播出。
 * 3、Notification listener 这是一个监听器，用于监听广播出来的通知信息。
 * 4、Notification filiter 这个一个过滤器，过滤掉不需要的通知。这个一般很少使用。
 */
public class QueueInspectorImpl extends NotificationBroadcasterSupport implements QueueInspector {

    private Queue<String> queue ;

    private long sequenceNumber = 1;

    public QueueInspectorImpl(Queue queue) {
        this.queue = queue;
    }

    @Override
    public QueueInfo getQueueInfo() {
        synchronized (queue){
            return new QueueInfo(new Date(),queue.size(), (String)queue.peek());
        }
    }

    @Override
    public void clearQueue() {
        synchronized (queue){
            queue.clear();
        }
    }

    @Override
    public void add(String value) {
        synchronized (queue){
            //获取队列的初始大写
            int oldSize = queue.size();
            //队列中添加一个元素
            boolean addVaule = queue.add(value);
            System.out.println("queue size now " + queue.size());
            //构建通知
            Notification n = new AttributeChangeNotification(this, sequenceNumber++, System.currentTimeMillis(), "queue add one value : " +value ,
                    "CacheSize", "int", oldSize,queue.size());
            //发送通知
            sendNotification(n);

        }
    }

    @Override
    public void poll() {
        synchronized (queue){
            //获取队列的初始大写
            int oldSize = queue.size();
            //删除队列收个元素
            String value = queue.poll();
            System.out.println("queue size now " + queue.size());
            //构建通知
            Notification n = new AttributeChangeNotification(this,
                    sequenceNumber++, System.currentTimeMillis(),
                    "queue remove one value  is : " + value , "queueSize", "int", oldSize,
                    queue.size());
            //发送通知
            sendNotification(n);

        }
    }

    /**
     *  这个方法是告诉JMX框架我们的MBean会发送哪几种类型的通知。
     *  如果我们在MBean中发送的通知类型，但是没有在这里声明，那么就是非法的。
     *  这个方法的返回值是MBeanNotificationInfo[]，每个通知类型对应数组中的一个元素。
     *  MBeanNotificationInfo对象中维护的信息包括：通知类型，通知对应的java类的全名，以及一些描述信息等。
     */
    @Override
    public MBeanNotificationInfo[] getNotificationInfo() {
        String[] types = new String[] { AttributeChangeNotification.ATTRIBUTE_CHANGE };
        String name = AttributeChangeNotification.class.getName();
        String description = "An attribute of this MBean has changed";
        MBeanNotificationInfo info = new MBeanNotificationInfo(types, name,description);
        return new MBeanNotificationInfo[] { info };
    }
}
